home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #11 / Amiga Plus CD - 2004 - No. 11.iso / AmiSoft / Dev / misc / temgen.lha / Temgen / Amigamain / Example2 / amigamain.c next >
C/C++ Source or Header  |  2004-06-26  |  6KB  |  263 lines

  1. #include <proto/exec.h>
  2. #include <proto/dos.h>
  3. #include <proto/intuition.h>
  4. #include <proto/icon.h>
  5. #include <workbench/startup.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <stdarg.h>
  9. #include "amigamain.h"
  10. #include "app.h"
  11.  
  12. struct Config config;
  13. char *vers="\0$VER: MyApp 0.1 (26.6.2004)";
  14. static BPTR oldout, newout;
  15.  
  16. struct IntuitionBase *IntuitionBase = NULL;
  17. struct Library *IconBase = NULL;
  18.  
  19. #define MSG_OK            "OK"
  20. #define MSG_REQTITLE      "Message"
  21. #define MSG_ERR_LIB       "Couldn't open %s V%ld\n"
  22. #define MSG_ERR_SHELL     "Application can't be started from Shell\n"
  23. #define MSG_ERR_WB        "Application can't be started from Workbench\n"
  24. #define MSG_ERR_RAM       "Couldn't allocate RAM in function %s\n"
  25. #define MSG_ERR_TOOLTYPES "Couldn't read tooltypes\n"
  26. #define MSG_ERR_READARGS  "Couldn't read command line arguments\n"
  27. #define MSG_ERR_OPEN      "Couldn't open stream %s\n"
  28.  
  29. static void cleanexit( void );
  30. static struct Library *save_open_library( UBYTE *libName, ULONG version);
  31. static void handle_tooltypes( struct WBStartup *wbmessage );
  32. static void handle_readargs( void );
  33.  
  34. int
  35. main(int argc, char *argv[] )
  36. {
  37.     atexit( cleanexit );
  38.     config.message_request = 1;
  39.     config.message_output = 1;
  40.     config.nr = 5;
  41.     if ( argc == 0 )
  42.     {
  43.         /* started from Workbench */
  44.         config.start_from_wb = TRUE;
  45.         if ( ! freopen( "con:10/50/300/100/stdin/AUTO"  , "r", stdin  ))
  46.         {
  47.             messagef( MSG_ERR_OPEN, "'stdin'" );
  48.             exit( EXIT_FAILURE );
  49.         }
  50.         if ( ! freopen( "con:10/150/300/100/stdout/AUTO", "w", stdout ))
  51.         {
  52.             messagef( MSG_ERR_OPEN, "'stdout'" );
  53.             exit( EXIT_FAILURE );
  54.         }
  55.  
  56.         newout = Open("con:10/250/300/100/AmigaDos/AUTO", MODE_OLDFILE);
  57.         if ( ! newout )
  58.         {
  59.             messagef( MSG_ERR_OPEN, "'AmigaDos'" );
  60.             exit( EXIT_FAILURE );
  61.         }
  62.         oldout = SelectOutput(newout );
  63.     }
  64.     IntuitionBase = (struct IntuitionBase *)
  65.         save_open_library("intuition.library", 40);
  66.     IconBase = save_open_library("icon.library", 40);
  67.     config.all_libraries_open = TRUE;
  68.     if ( config.start_from_wb )
  69.     {
  70.         handle_tooltypes( (struct WBStartup *) argv );
  71.     }
  72.     else
  73.     {
  74.         handle_readargs();
  75.     }
  76.     APP_run();
  77.     return EXIT_SUCCESS;
  78. }
  79.  
  80. /*
  81.   open EasyRequest
  82. */
  83. LONG
  84. show_request( char *title, char *text, char *button, ... )
  85. {
  86.     va_list ap;
  87.     va_start(ap, button );
  88.     return show_request_args(title, text, button, ap);
  89.     va_end(ap );
  90. }
  91.  
  92. /*
  93.   open EasyRequest (va_list)
  94. */
  95. LONG
  96. show_request_args( char *title, char *text, char *button, va_list ap )
  97. {
  98.     struct EasyStruct es = {sizeof (struct EasyStruct), 0, 0, 0, 0};
  99.     es.es_Title = title;
  100.     es.es_TextFormat = text;
  101.     es.es_GadgetFormat = button;
  102.     return EasyRequestArgs(config.reqwin, &es, 0, ap);
  103. }
  104.  
  105. /*
  106.   formated output to Output() and/or Workbench
  107.   parameters like vprintf
  108. */
  109. void
  110. vmessagef( char *format, va_list ap )
  111. {
  112.     if ( ! format) return;
  113.     if ( config.message_output )
  114.     {
  115.         VPrintf(format, ap);
  116.         Flush( Output() );
  117.     }
  118.     if ( config.message_request && IntuitionBase )
  119.     {
  120.         show_request_args( MSG_REQTITLE, format, MSG_OK, ap);
  121.     }
  122. }
  123.  
  124. /*
  125.   messagef (like printf)
  126. */
  127. void
  128. messagef( char *format, ... )
  129. {
  130.     va_list ap;
  131.     va_start(ap, format);
  132.     vmessagef(format, ap);
  133.     va_end(ap);
  134. }
  135.  
  136. /*
  137.   copies string s to new allocated RAM
  138. */
  139. char *
  140. strcpy_malloc(const char *s )
  141. {
  142.     char *dest;
  143.     if ( ! s)
  144.         return NULL;
  145.     dest = malloc( strlen( s ) + 1);
  146.     if ( ! dest )
  147.     {
  148.         messagef( MSG_ERR_RAM , "strcpy_malloc");
  149.         exit( EXIT_FAILURE );
  150.     }
  151.     strcpy(dest, s);
  152.     return dest;
  153. }
  154.  
  155. /*
  156.   OpenLibrary with check of return value
  157. */
  158. static struct Library *
  159. save_open_library(UBYTE *libName, ULONG version)
  160. {
  161.     struct Library *lib;
  162.     lib = OpenLibrary(libName, version);
  163.     if ( ! lib )
  164.     {
  165.         messagef( MSG_ERR_LIB ,libName, version );
  166.         exit( EXIT_FAILURE);
  167.     }
  168.     return lib;
  169. }
  170.  
  171. /*
  172.   qearies diskobject for tooltype entries
  173. */
  174. static void
  175. handle_tooltypes( struct WBStartup *wbmessage )
  176. {
  177.     struct DiskObject *dobj;
  178.     struct WBArg *wbarg;
  179.     STRPTR *toolarray;
  180.     STRPTR s;
  181.     wbarg = wbmessage->sm_ArgList;
  182.     if (( *wbarg->wa_Name ) && ( dobj = GetDiskObject( wbarg->wa_Name )))
  183.     {
  184.         toolarray = dobj->do_ToolTypes;
  185.         if ( s = FindToolType( toolarray, "PUBSCREEN" ))
  186.         {
  187.             free( config.pubscreen );
  188.             config.pubscreen = strcpy_malloc( s );
  189.         }
  190.  
  191.         if ( s = FindToolType( toolarray, "JINGLE" ))
  192.         {
  193.             config.jingle = TRUE;
  194.         }
  195.  
  196.         if ( s = FindToolType( toolarray, "NR" ))
  197.         {
  198.             config.nr = atol( s );
  199.         }
  200.  
  201.         FreeDiskObject( dobj );
  202.     }
  203.     else
  204.     {
  205.         messagef( MSG_ERR_TOOLTYPES );
  206.         exit( EXIT_FAILURE );
  207.     }
  208. }
  209.  
  210. /*
  211.   qearies command line args
  212. */
  213. static void
  214. handle_readargs( void )
  215. {
  216.     struct RDArgs *rda;
  217.     LONG options[ 3 ] = { 0 };
  218.     rda = ReadArgs( "P=PUBSCREEN/K,J=JINGLE/S,NR/N" , options, NULL);
  219.     if ( rda )
  220.     {
  221.         if ( options[ 0 ] )
  222.         {
  223.             free( config.pubscreen );
  224.             config.pubscreen = strcpy_malloc( (STRPTR)options[ 0 ] );
  225.         }
  226.  
  227.         config.jingle = options[ 1 ] ? TRUE : FALSE;
  228.  
  229.         if ( options[ 2] )
  230.         {
  231.             config.nr = *(LONG *)options[ 2 ];
  232.         }
  233.  
  234.         FreeArgs(rda );
  235.     }
  236.     else
  237.     {
  238.         messagef( MSG_ERR_READARGS );
  239.         exit( EXIT_FAILURE );
  240.     }
  241. }
  242.  
  243. /*
  244.   cleanup function for atexit
  245. */
  246. static void
  247. cleanexit( void )
  248. {
  249.     APP_clean();
  250.     if ( config.start_from_wb )
  251.         Delay( 200 );
  252.     if ( config.all_libraries_open )
  253.     {
  254.         if ( newout )
  255.         {
  256.             SelectOutput(oldout );
  257.             Close(newout );
  258.         }
  259.     }
  260.     CloseLibrary((struct Library *) IntuitionBase );
  261.     CloseLibrary(IconBase );
  262. }
  263.